#include "Sock.hpp"
#include <functional>
#include <signal.h>

class HttpServer
{
private:
    using Func_t = std::function<void(int)>;
private:
    uint16_t _port;
    Func_t _func; 
    std::string _ip;

    Sock _sock;
    int _listensock;
public:
    HttpServer(const uint16_t &port,const Func_t &func,const std::string &ip="0.0.0.0")
        :_port(port)
        ,_func(func)
        ,_ip(ip)
    {
        // 1.创建套接字
        _listensock=_sock.Socket();
        // 2.进行绑定
        _sock.Bind(_listensock,_port,_ip);
        // 3.设置监听状态
        _sock.Listen(_listensock);
    }

    ~HttpServer()
    {
        if(_listensock>=0)
            close(_listensock);
    }

    void Start()
    {
        signal(SIGCHLD,SIG_IGN); // 避免僵尸进程

        uint16_t clientport;
        std::string clientip;
        for(;;)
        {
            // 获取连接
            int sockfd=_sock.Accept(_listensock,&clientip,&clientport);

            if(sockfd<0)
                continue;
            
            if(fork()==0)
            {
                close(_listensock);
                _func(sockfd);
                close(sockfd);
                exit(0);
            }

            close(sockfd);
        }
    }
};